HLS 是由蘋果提出的串流媒體網路傳輸協定。
在一個 HLS 連線開始的時候,客戶端會先去請求一個 M3U8 格式的文件,裡面紀錄著播放列表檔案。
如果我們在網路上想要下載一個影片,且它是 .mp4 格式,那麼我們可以用 wget 下載它。
如果撈封包的時候未見常見的影片格式,取而代之的是一長串的 .ts,或者有 .m3u8 的封包,我們就可以確定它是 HLS。
這時候可以使用 ffmpeg 來下載這個檔案。
$ ffmpeg -i <m3u8_url> -c copy video.mp4
最早我設計了 Avgle 網站的下載器。
當時遇到了許多困難,主要是因為撈封包的過程不易取得 .m3u8 的檔案。
後來發現 youtube-dl 也能下載該網站的影片,所以最後就把自己的下載器專案放棄了。
我後來以一樣的概念,設計了 Jable 網站的下載器。
由於 .ts 檔案通常只會有 5 ~ 10 秒的畫面,所以一部日本愛情動作片通常會有 500 ~ 1500 左右個 .ts 檔案。
所以我想到,可以用利用多線呈去發送非同步請求,來加速多個 .ts 下載的速度。
在 download 的函式可以看見我對多線呈下載的實做。
https://github.com/Yooootsuba/jabledl/blob/master/jabledl/downloader.py#L46
我設定了一個線呈最大值,如果現有的線呈已經超過這個數量,就不可以繼續新增。
流量太大勢必會造成對方伺服器的負擔,對自己的下載也沒有好處。